Wevioo recommendation system model

Preparing for the model step

In [1]:
#import the necessary packages
import pandas as pd
import numpy as np
import numpy.linalg as ln
import plotly.graph_objects as go
import plotly.express as px
import pandas as pd
from bokeh.io import show, output_notebook, push_notebook
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource, HoverTool
from sklearn.manifold import TSNE
from sklearn.neighbors import NearestNeighbors
from sklearn.neighbors import KDTree
import warnings
warnings.filterwarnings('ignore')
pd.set_option('display.max_columns', 10)
#pd.set_option('display.max_rows', None)
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt 
from sklearn.cluster import AffinityPropagation
from sklearn.cluster import SpectralClustering 
from sklearn.cluster import Birch
from sklearn.cluster import KMeans
# import the necessary library for Kendall correlation coefficient
from scipy.stats import kendalltau
# import the necessary library for Spearman correlation coefficient
from scipy.stats import spearmanr
# import the necessary library for Pearson correlation coefficient
from scipy.stats import pearsonr
In [2]:
# Load the data to put in model
df = pd.read_csv("df_final17_04_2020.csv" , sep='\t')
df.drop(['Unnamed: 0'], axis=1, inplace=True)
In [3]:
# Load the data to extract the employees information 
personal_info1 = pd.read_csv("personal_info.csv" , sep='\t')
personal_info1.drop(['Unnamed: 0'], axis=1, inplace=True)
personal_info1.tail(2)
Out[3]:
name headline company school location ... email phone connected websites url
9998 Syrine Fadhli Business Analyst Junior chez VERMEG for Bankin... VERMEG for Banking & Insurance Software TeleTrade Tunisie Gouvernorat de l’Ariana, Tunisia ... NaN NaN NaN [] https://www.linkedin.com/in/syrine-fadhli-2683...
9999 ahmed khemiri Microsoft Student Partner | Machine Learning E... Microsoft Faculty of law, Economics and Management Scien... Jendouba Nord, Jendouba Governorate, Tunisia ... NaN NaN NaN [] https://www.linkedin.com/in/ahmed-khemiri-b334...

2 rows × 13 columns

In [4]:
# Define the experience range of each employee into year interval
df['date_exp']=round(df['date_exp']/12 , 2)
df.head(5)
Out[4]:
date_exp javascript sql nosql node.js ... Others_type_Of_Study Tunisia Volunteering job job2
0 19.33 0.0 0.0 0.0 0.0 ... 1.0 1.0 0.0 0 Technical Lead/ Architecte JEE
1 4.08 0.0 1.0 0.0 0.0 ... 1.0 1.0 0.0 1 Devops
2 27.50 0.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 2 Web Back-End
3 2.25 0.0 0.0 0.0 0.0 ... 1.0 0.0 1.0 3 Data_Science
4 0.42 0.0 0.0 0.0 0.0 ... 1.0 1.0 0.0 4 Other

5 rows × 134 columns

In [5]:
# Concatinate all the importatnt data (model data + information data)
df_final=pd.concat([df,personal_info1['name']],axis=1)
df_final.head(30)
Out[5]:
date_exp javascript sql nosql node.js ... Tunisia Volunteering job job2 name
0 19.33 0.0 0.0 0.0 0.0 ... 1.0 0.0 0 Technical Lead/ Architecte JEE Imen Hammi
1 4.08 0.0 1.0 0.0 0.0 ... 1.0 0.0 1 Devops Helmi Nour
2 27.50 0.0 0.0 0.0 0.0 ... 1.0 0.0 2 Web Back-End Zied Brahmi
3 2.25 0.0 0.0 0.0 0.0 ... 0.0 1.0 3 Data_Science Hamza Ben Marzouk
4 0.42 0.0 0.0 0.0 0.0 ... 1.0 0.0 4 Other Habib Morchedi
5 11.75 0.0 1.0 0.0 0.0 ... 0.0 0.0 5 Embarqué Middleware Ines Mahjoub
6 6.50 0.0 0.0 0.0 0.0 ... 1.0 0.0 4 Other Hamza KEFI
7 11.75 1.0 1.0 0.0 0.0 ... 1.0 0.0 0 Technical Lead/ Architecte JEE Maroua ELLOUZE
8 0.00 0.0 0.0 0.0 0.0 ... 1.0 0.0 4 Other Omar Ghazouani
9 8.25 0.0 0.0 0.0 0.0 ... 1.0 0.0 6 informatique Talmoudi Khouloud
10 7.92 0.0 0.0 0.0 0.0 ... 0.0 0.0 1 Devops kammoun walid
11 17.42 1.0 0.0 0.0 0.0 ... 1.0 0.0 7 Front-End walid H.
12 4.00 0.0 0.0 0.0 0.0 ... 0.0 0.0 0 Technical Lead/ Architecte JEE Fayez DEBBABI ☁️
13 7.50 0.0 0.0 0.0 0.0 ... 1.0 0.0 6 informatique Nada Ghedamsi
14 4.58 0.0 0.0 0.0 0.0 ... 1.0 0.0 8 JAVA/JEE Hanen Ben Ali
15 6.50 0.0 2.0 0.0 0.0 ... 0.0 0.0 3 Data_Science Moncef Bettaieb
16 13.67 0.0 0.0 0.0 0.0 ... 1.0 0.0 4 Other Ali Daboussi
17 2.75 0.0 0.0 0.0 0.0 ... 1.0 0.0 8 JAVA/JEE Nada Ben Said
18 20.42 0.0 0.0 0.0 0.0 ... 0.0 0.0 4 Other Anis THAMEUR ♠️ Capgemini
19 9.83 0.0 0.0 0.0 0.0 ... 1.0 0.0 6 informatique Manel Bayoudh
20 7.33 0.0 0.0 0.0 0.0 ... 0.0 0.0 9 Stage Cassandra Fabre
21 12.33 0.0 1.0 0.0 0.0 ... 0.0 0.0 10 PHP/Symfony Bellaaj Habib
22 7.83 0.0 0.0 0.0 0.0 ... 0.0 0.0 5 Embarqué Middleware Nicolas S.
23 1.33 0.0 0.0 0.0 0.0 ... 1.0 0.0 0 Technical Lead/ Architecte JEE amani mouldi
24 16.25 0.0 0.0 0.0 0.0 ... 1.0 0.0 9 Stage Nadia Belhassen
25 2.25 0.0 0.0 0.0 0.0 ... 1.0 0.0 4 Other Ghanney Adam
26 3.67 1.0 2.0 0.0 0.0 ... 1.0 0.0 0 Technical Lead/ Architecte JEE Balkis Charai
27 17.25 0.0 0.0 0.0 0.0 ... 1.0 0.0 6 informatique Medini Mohmaed Amine
28 10.00 0.0 0.0 0.0 0.0 ... 0.0 0.0 8 JAVA/JEE ibrahim zammel
29 7.75 0.0 1.0 0.0 2.0 ... 0.0 0.0 2 Web Back-End Hiba Feidi

30 rows × 135 columns

In [6]:
# read the excel file to use both the employee profile skills with their correspond coefficient
exel_ponderation= pd.read_excel("wevioo rh skills with coefs.xlsx")
exel_ponderation
Out[6]:
Unnamed: 0 profile technologies coef
0 0 Web Back-End JavaScript 1
1 1 Web Back-End SQL 3
2 2 Web Back-End NoSQL 2
3 3 Web Back-End Node.js 3
4 4 Web Back-End Express.js 3
... ... ... ... ...
69 69 DRUPAL GIT 2
70 70 Product Owner Scrum 3
71 71 Product Owner Analyse fonctionnelle 3
72 72 Product Owner Testing 3
73 73 Product Owner Rédaction 3

74 rows × 4 columns

In [7]:
# calculate the skills coefficients dynamically according to the profile job
# Nb : we calculate both the professional skills and the academic skills 
for i in range(exel_ponderation.shape[0]):
    for j in range(df_final.shape[0]):
        if df_final['job2'][j].lower()== exel_ponderation['profile'][i].lower():
            df_final[exel_ponderation['technologies'][i].lower()][j]=df_final[exel_ponderation['technologies'][i].lower()][j]*exel_ponderation['coef'][i]
            df_final[exel_ponderation['technologies'][i].lower()+'_academic'][j]=df_final[exel_ponderation['technologies'][i].lower()+'_academic'][j]*exel_ponderation['coef'][i]
In [8]:
df_final.head(50)
Out[8]:
date_exp javascript sql nosql node.js ... Tunisia Volunteering job job2 name
0 19.33 0.0 0.0 0.0 0.0 ... 1.0 0.0 0 Technical Lead/ Architecte JEE Imen Hammi
1 4.08 0.0 1.0 0.0 0.0 ... 1.0 0.0 1 Devops Helmi Nour
2 27.50 0.0 0.0 0.0 0.0 ... 1.0 0.0 2 Web Back-End Zied Brahmi
3 2.25 0.0 0.0 0.0 0.0 ... 0.0 1.0 3 Data_Science Hamza Ben Marzouk
4 0.42 0.0 0.0 0.0 0.0 ... 1.0 0.0 4 Other Habib Morchedi
5 11.75 0.0 1.0 0.0 0.0 ... 0.0 0.0 5 Embarqué Middleware Ines Mahjoub
6 6.50 0.0 0.0 0.0 0.0 ... 1.0 0.0 4 Other Hamza KEFI
7 11.75 1.0 1.0 0.0 0.0 ... 1.0 0.0 0 Technical Lead/ Architecte JEE Maroua ELLOUZE
8 0.00 0.0 0.0 0.0 0.0 ... 1.0 0.0 4 Other Omar Ghazouani
9 8.25 0.0 0.0 0.0 0.0 ... 1.0 0.0 6 informatique Talmoudi Khouloud
10 7.92 0.0 0.0 0.0 0.0 ... 0.0 0.0 1 Devops kammoun walid
11 17.42 3.0 0.0 0.0 0.0 ... 1.0 0.0 7 Front-End walid H.
12 4.00 0.0 0.0 0.0 0.0 ... 0.0 0.0 0 Technical Lead/ Architecte JEE Fayez DEBBABI ☁️
13 7.50 0.0 0.0 0.0 0.0 ... 1.0 0.0 6 informatique Nada Ghedamsi
14 4.58 0.0 0.0 0.0 0.0 ... 1.0 0.0 8 JAVA/JEE Hanen Ben Ali
15 6.50 0.0 2.0 0.0 0.0 ... 0.0 0.0 3 Data_Science Moncef Bettaieb
16 13.67 0.0 0.0 0.0 0.0 ... 1.0 0.0 4 Other Ali Daboussi
17 2.75 0.0 0.0 0.0 0.0 ... 1.0 0.0 8 JAVA/JEE Nada Ben Said
18 20.42 0.0 0.0 0.0 0.0 ... 0.0 0.0 4 Other Anis THAMEUR ♠️ Capgemini
19 9.83 0.0 0.0 0.0 0.0 ... 1.0 0.0 6 informatique Manel Bayoudh
20 7.33 0.0 0.0 0.0 0.0 ... 0.0 0.0 9 Stage Cassandra Fabre
21 12.33 0.0 1.0 0.0 0.0 ... 0.0 0.0 10 PHP/Symfony Bellaaj Habib
22 7.83 0.0 0.0 0.0 0.0 ... 0.0 0.0 5 Embarqué Middleware Nicolas S.
23 1.33 0.0 0.0 0.0 0.0 ... 1.0 0.0 0 Technical Lead/ Architecte JEE amani mouldi
24 16.25 0.0 0.0 0.0 0.0 ... 1.0 0.0 9 Stage Nadia Belhassen
25 2.25 0.0 0.0 0.0 0.0 ... 1.0 0.0 4 Other Ghanney Adam
26 3.67 1.0 2.0 0.0 0.0 ... 1.0 0.0 0 Technical Lead/ Architecte JEE Balkis Charai
27 17.25 0.0 0.0 0.0 0.0 ... 1.0 0.0 6 informatique Medini Mohmaed Amine
28 10.00 0.0 0.0 0.0 0.0 ... 0.0 0.0 8 JAVA/JEE ibrahim zammel
29 7.75 0.0 3.0 0.0 6.0 ... 0.0 0.0 2 Web Back-End Hiba Feidi
30 5.83 0.0 0.0 0.0 0.0 ... 0.0 1.0 6 informatique Noureddine Smida
31 10.25 2.0 2.0 0.0 0.0 ... 0.0 0.0 8 JAVA/JEE Abdesslem Nahli
32 3.00 0.0 2.0 0.0 0.0 ... 1.0 0.0 1 Devops HAJJI Mohamed
33 51.08 0.0 0.0 0.0 0.0 ... 1.0 0.0 9 Stage Slim Abdeljelil
34 11.08 0.0 0.0 0.0 0.0 ... 0.0 0.0 0 Technical Lead/ Architecte JEE Asma Khan
35 8.00 0.0 0.0 0.0 0.0 ... 1.0 0.0 3 Data_Science Mohamed BEN SLAMA
36 9.00 0.0 0.0 0.0 0.0 ... 0.0 0.0 3 Data_Science Moetez BEN SALAH ●
37 9.42 2.0 1.0 0.0 0.0 ... 0.0 0.0 11 DRUPAL Omar Kammoun
38 0.00 0.0 0.0 0.0 0.0 ... 1.0 0.0 0 Technical Lead/ Architecte JEE Jarboui Mohamed
39 0.75 0.0 0.0 0.0 0.0 ... 1.0 0.0 9 Stage Aziz Boulares
40 20.25 0.0 0.0 0.0 0.0 ... 1.0 0.0 3 Data_Science Yousri Hajri
41 21.17 0.0 1.0 0.0 0.0 ... 1.0 0.0 0 Technical Lead/ Architecte JEE Salah KAABAOUI
42 27.83 0.0 2.0 0.0 0.0 ... 1.0 0.0 4 Other Mohamed Ali Touati
43 9.50 0.0 0.0 0.0 0.0 ... 0.0 0.0 4 Other Boutheina Dab
44 21.33 0.0 0.0 0.0 0.0 ... 1.0 0.0 4 Other Rafik Letaief
45 0.00 0.0 0.0 0.0 0.0 ... 1.0 0.0 0 Technical Lead/ Architecte JEE Habiba awali
46 11.67 0.0 0.0 0.0 0.0 ... 0.0 0.0 8 JAVA/JEE fadia jbali
47 11.67 0.0 0.0 0.0 0.0 ... 1.0 0.0 3 Data_Science Mahdi KAMMOUN
48 10.67 0.0 0.0 0.0 0.0 ... 1.0 0.0 4 Other wathik ben jebli
49 6.00 0.0 0.0 0.0 0.0 ... 1.0 0.0 9 Stage Baha Boulaabi

50 rows × 135 columns

In [9]:
Q=df_final.iloc[:,:-3]

t-distributed stochastic neighbor embedding

In [10]:
## T-Sne is a dimension reduction machine learning algorithm to visualise the profile distribution
In [11]:
A=df_final.iloc[:,:-2].to_numpy()
In [12]:
A
Out[12]:
array([[19.33,  0.  ,  0.  , ...,  1.  ,  0.  ,  0.  ],
       [ 4.08,  0.  ,  1.  , ...,  1.  ,  0.  ,  1.  ],
       [27.5 ,  0.  ,  0.  , ...,  1.  ,  0.  ,  2.  ],
       ...,
       [ 4.33,  0.  ,  0.  , ...,  1.  ,  0.  ,  2.  ],
       [ 0.  ,  0.  ,  0.  , ...,  1.  ,  0.  ,  3.  ],
       [ 8.17,  0.  ,  0.  , ...,  1.  ,  0.  ,  3.  ]])
In [13]:
A_list=A.tolist()
In [14]:
# Dimension reduction with 2 t-SNE components
model = TSNE(n_components=2,learning_rate=200,random_state=42,n_iter=300)
tsne_features = model.fit_transform(A)

# Make X, Y columns 
df_final['X'] = tsne_features[: ,0]
df_final['Y'] = tsne_features[: ,1]
In [15]:
# Dimension reduction with 3 t-SNE components
model3D = TSNE(n_components=3,learning_rate=200,random_state=42,n_iter=300)
tsne_features3D = model3D.fit_transform(A)

# Make X, Y, Z columns 
df_final['X3D'] = tsne_features3D[: ,0]
df_final['Y3D'] = tsne_features3D[: ,1]
df_final['Z3D'] = tsne_features3D[: ,2]
In [16]:
#use bokeh as our first visualization tool to the t-SNE distribution
output_notebook()

# Make a source and a scatter plot  
source = ColumnDataSource(df_final)
plot = figure(x_axis_label = "T-SNE 1", 
              y_axis_label = "T-SNE 2", 
              width = 500, height = 400)
plot.circle(x = 'X', 
    y = 'Y', 
    source = source, 
    size = 4, color = '#084594'
 , alpha = .8)
Loading BokehJS ...
Out[16]:
GlyphRenderer(
id = '1038', …)
In [17]:
# Create a HoverTool object to visualize each scatter information (name + job)
hover = HoverTool(tooltips = [('name', '@name'),
                              ('job2', '@job2')])
plot.add_tools(hover)
In [18]:
# show our first visualization
show(plot)
In [19]:
# use plotly to have a better visualization of the profile distribution with the t-SNE distribution
fig = go.Figure(data=go.Scatter(x=df_final['X'],
                                y=df_final['Y'],
                                mode='markers',
                                marker_color=df_final['job'],
                                text=df_final['name']+"****"+df_final["job2"])) 

fig.update_layout(title='TSNE 2D')
fig.show()
In [20]:
# Identify each profile with their jobs
fig2 = px.scatter(df_final, x="X", y="Y", color="job2",color_discrete_sequence=["red", "blue", "orange", "pink", "magenta","yellow","crimson","cyan","orange","purple","lightgreen","black"],
                  hover_data=['job2','name'])
fig2.update_layout(title='TSNE 2D')
fig2.show()
In [21]:
df_final
Out[21]:
date_exp javascript sql nosql node.js ... X Y X3D Y3D Z3D
0 19.33 0.0 0.0 0.0 0.0 ... -4.758760 8.773571 -3.951055 -4.474208 -3.501209
1 4.08 0.0 1.0 0.0 0.0 ... 4.893010 5.077026 1.122425 0.832490 -4.786875
2 27.50 0.0 0.0 0.0 0.0 ... -7.787174 6.707171 -3.714674 -6.299805 -1.659095
3 2.25 0.0 0.0 0.0 0.0 ... 5.337455 -4.412300 4.303947 2.526043 -3.390142
4 0.42 0.0 0.0 0.0 0.0 ... 6.356594 -5.454003 4.915003 3.739429 -2.308075
... ... ... ... ... ... ... ... ... ... ... ...
9995 6.58 0.0 0.0 0.0 0.0 ... 2.544377 -1.465383 1.382784 0.651283 -2.077024
9996 0.33 0.0 0.0 0.0 0.0 ... 6.852204 -5.663661 4.881880 4.295182 -2.367555
9997 4.33 0.0 0.0 0.0 0.0 ... 6.559744 3.372770 -2.119009 4.017203 -2.686331
9998 0.00 0.0 0.0 0.0 0.0 ... 10.652040 1.845731 0.244361 6.155900 -3.789653
9999 8.17 0.0 0.0 0.0 0.0 ... 1.608778 0.926692 -0.256888 0.828393 -2.002612

10000 rows × 140 columns

In [22]:
# use plotly 3D in order to enhance our visualization quality
fig3 = px.scatter_3d(df_final, x="X3D", y="Y3D",z="Z3D", color="job2",color_discrete_sequence=["red", "blue", "orange", "pink", "magenta","yellow","crimson","cyan","orange","purple","lightgreen","black"],
                  hover_data=['job2','name'])
fig3.update_layout(title='TSNE 3D')
fig3.show()

Content-based recommender system

Unsupervised Nearest Neighbors¶

In [33]:
# use the nearest neighbors machine learning algorithm to identify the distances betwwen the profiles
nbrs = NearestNeighbors(n_neighbors=11, algorithm='ball_tree').fit(A)
distances, indices = nbrs.kneighbors(A)
In [34]:
# identify the closest 10 profile distances for each employee
distances
Out[34]:
array([[0.        , 0.25      , 1.30598622, ..., 2.23606798, 2.43698584,
        2.44948974],
       [0.        , 5.5733742 , 5.58283978, ..., 6.04942973, 6.09225738,
        6.09334883],
       [0.        , 3.0575971 , 4.28093448, ..., 4.77979079, 4.84767986,
        4.98121471],
       ...,
       [0.        , 2.82985865, 3.17748328, ..., 3.61420807, 3.65624124,
        3.67423461],
       [0.        , 0.        , 0.        , ..., 1.        , 1.        ,
        1.        ],
       [0.        , 3.16355812, 3.17214439, ..., 3.32603367, 3.36340601,
        3.4185377 ]])
In [35]:
# identify the closest 10 indices distance for each employee
indices
Out[35]:
array([[   0, 8678, 1547, ..., 6833, 6400,  328],
       [   1, 7782, 7344, ..., 7988, 2157, 7272],
       [   2, 8168, 9183, ..., 7893, 1056, 4023],
       ...,
       [9997, 5120, 3828, ..., 4530, 1303, 9255],
       [9720, 9998, 8747, ..., 4352, 3053,  445],
       [9999, 6554, 4533, ..., 5359, 1969, 8504]], dtype=int64)
In [36]:
# prepare the functions that allows to identify the index from name and make url clickable
def get_index_from_name(name):
    return df_final[df_final["name"]==name].index.tolist()[0]

#*******************

all_profil_names = list(df_final.name.values)
def get_id_from_partial_name(partial):
    for name in all_profil_names:
        if partial in name:
            print(name,all_profil_names.index(name))

            
#***************

def make_clickable(val):
    return '<a target="_blank" href="{}">{}</a>'.format(val,val)
In [37]:
get_index_from_name("Mouna TRABELSI")
Out[37]:
7805
In [38]:
# print_similar_profile is a function that allows to have a dataframe that contains name, job, distance and url
# for the 10 closest profile
def print_similar_profil(query=None,id=None):
    i=0
    if id:
        df_sim=pd.DataFrame(index=indices[id],columns=["name","job2","distance","url"])
        for id1 in indices[id][0:]:
            df_sim.loc[id1,"name"]=df_final.iloc[id1]["name"]
            df_sim.loc[id1,"job2"]=df_final.iloc[id1]["job2"]
            df_sim.loc[id1,"distance"]=distances[id][i]
            df_sim.loc[id1,"url"]= personal_info1.loc[id1,"url"]
            i+=1
        

    if query:
        found_id = get_index_from_name(query)
        df_sim=pd.DataFrame(index=indices[found_id],columns=["name","job2","distance","url"])
        for id1 in indices[found_id][0:]:
            df_sim.loc[id1,"name"]=df_final.iloc[id1]["name"]
            df_sim.loc[id1,"job2"]=df_final.iloc[id1]["job2"]
            df_sim.loc[id1,"distance"]=distances[found_id][i]
            df_sim.loc[id1,"url"]= personal_info1.loc[id1,"url"]
            i+=1
    
    return df_sim.style.format({'url':make_clickable})
In [53]:
# examples of print_similar_profil using indice
print_similar_profil(id=11)
Out[53]:
name job2 distance url
11 walid H. Front-End 0.000000 https://www.linkedin.com/in/walid-h-188a673a
1577 Mourad Akremi Front-End 6.583927 https://www.linkedin.com/in/mourad-akremi-93168562
932 Mahmoud Nbet Front-End 7.960302 https://www.linkedin.com/in/mahmoud-nbet
682 Fethi Krout Front-End 8.085722 https://www.linkedin.com/in/fethi-krout-b6557948
3710 Maher Soua Front-End 8.849751 https://www.linkedin.com/in/mahersoua
4888 hamdi ghaoui Front-End 8.896943 https://www.linkedin.com/in/hamdi-ghaoui-68210250
2561 Saber CHEBKA Front-End 9.069179 https://www.linkedin.com/in/saberchebka
9675 Naïm Lamloumi Other 9.202657 https://www.linkedin.com/in/naïm-lamloumi-321a8b84
5055 Naïm Lamloumi Other 9.202657 https://www.linkedin.com/in/na%C3%AFm-lamloumi-321a8b84
6944 Issam Mzoughi Front-End 9.252913 https://www.linkedin.com/in/issam-mzoughi-1b962425
2751 Amal Gritli Omrani Other 9.663623 https://www.linkedin.com/in/amal-gritli-omrani-a361a383
In [54]:
print_similar_profil(id=682)
Out[54]:
name job2 distance url
682 Fethi Krout Front-End 0.000000 https://www.linkedin.com/in/fethi-krout-b6557948
4888 hamdi ghaoui Front-End 7.726506 https://www.linkedin.com/in/hamdi-ghaoui-68210250
11 walid H. Front-End 8.085722 https://www.linkedin.com/in/walid-h-188a673a
932 Mahmoud Nbet Front-End 8.234835 https://www.linkedin.com/in/mahmoud-nbet
138 Fares Doghri Front-End 9.303032 https://www.linkedin.com/in/faresdoghri
5739 Bilel Bekkouche Front-End 9.382905 https://www.linkedin.com/in/bilel-bekkouche-05a00483
1577 Mourad Akremi Front-End 9.464481 https://www.linkedin.com/in/mourad-akremi-93168562
3401 Anouar El Heni Front-End 9.477151 https://www.linkedin.com/in/anouar-el-heni-632261117
3099 Houdhaifa Hamza Front-End 9.500000 https://www.linkedin.com/in/houdhaifa-hamza
8134 Abdelhak El Mahdaouy Front-End 9.500000 https://www.linkedin.com/in/abdelhak-el-mahdaouy-187bb283
3710 Maher Soua Front-End 9.679174 https://www.linkedin.com/in/mahersoua
In [55]:
# example of print_similar_profil using name
print_similar_profil(query="Hanen Ben Ali")
Out[55]:
name job2 distance url
14 Hanen Ben Ali JAVA/JEE 0.000000 https://www.linkedin.com/in/hanen-ben-ali-82617591
7085 chaima taboubi JAVA/JEE 4.949747 https://www.linkedin.com/in/chaima-taboubi-625567113
491 olfa taher JAVA/JEE 4.956057 https://www.linkedin.com/in/olfa-taher-420088131
2546 Seif Allah Bader JAVA/JEE 5.219013 https://www.linkedin.com/in/seifallahbader
9328 seifeddine daoud JAVA/JEE 5.292107 https://www.linkedin.com/in/seifeddine-daoud-a17a6475
234 Manel Affi informatique 5.385165 https://www.linkedin.com/in/manel-affi-10bb168b
6732 Iskander Zghal Stage 5.479562 https://www.linkedin.com/in/iskander-zghal-8419286b
9830 Sabrine Mbarek informatique 5.482928 https://www.linkedin.com/in/sabrine-mbarek-51111414a
9862 elhem boudabous JAVA/JEE 5.500000 https://www.linkedin.com/in/elhem-boudabous-a0598769
9021 Asma Bouktif Stage 5.505679 https://www.linkedin.com/in/asma-bouktif-46b06a115
5072 Siwar Tlili JAVA/JEE 5.508684 https://www.linkedin.com/in/siwar-tlili-401bb1128

Verify and evaluate the Nearest Neighbors algorithm performance

In [30]:
df_final[df_final["name"]=="Oumayma Metoui"]
Out[30]:
date_exp javascript sql nosql node.js ... job job2 name X Y
843 4.25 0.0 0.0 0.0 0.0 ... 3 FullStack JS Oumayma Metoui 3.799219 -2.845196

1 rows × 137 columns

In [31]:
df_final[df_final["name"]=="Hamza Romdhani"]
Out[31]:
date_exp javascript sql nosql node.js ... job job2 name X Y
3307 3.92 0.0 0.0 0.0 0.0 ... 3 FullStack JS Hamza Romdhani 3.603981 -2.695485

1 rows × 137 columns

In [32]:
df_final[df_final["name"]=="Hanen Ben Ali"]
Out[32]:
date_exp javascript sql nosql node.js ... job job2 name X Y
14 4.67 0.0 0.0 0.0 0.0 ... 3 FullStack JS Hanen Ben Ali 3.604467 -2.774269

1 rows × 137 columns

In [33]:
df_final[df_final["name"]=="Achref Sellami"]
Out[33]:
date_exp javascript sql nosql node.js ... job job2 name X Y
5165 4.5 0.0 1.0 0.0 0.0 ... 7 Front-End Achref Sellami 6.204932 2.149419
6108 6.0 0.0 0.0 0.0 0.0 ... 3 FullStack JS Achref Sellami 3.494366 -2.681659

2 rows × 137 columns

KDTREE

In [56]:
# use the KDTree machine learning algorithm to identify the distances betwwen the profiles
kdt = KDTree(A, leaf_size=30, metric='euclidean')
distance_kdtree,indice_kdtree=kdt.query(A, k=10)   
In [57]:
# identify the closest 10 indices distance for each employee
indice_kdtree
Out[57]:
array([[   0, 8678, 1547, ..., 1068, 6833, 6400],
       [   1, 7782, 7344, ..., 9940, 7988, 2157],
       [   2, 8168, 9183, ..., 9026, 7893, 1056],
       ...,
       [9997, 5120, 3828, ...,  115, 4530, 1303],
       [9998, 8747, 9720, ...,  291, 7918, 5670],
       [9999, 6554, 4533, ..., 8974, 5359, 1969]], dtype=int64)
In [58]:
# identify the closest 10 profile distances for each employee
distance_kdtree
Out[58]:
array([[0.        , 0.25      , 1.30598622, ..., 2.23606798, 2.23606798,
        2.43698584],
       [0.        , 5.5733742 , 5.58283978, ..., 6.03729244, 6.04942973,
        6.09225738],
       [0.        , 3.0575971 , 4.28093448, ..., 4.70201021, 4.77979079,
        4.84767986],
       ...,
       [0.        , 2.82985865, 3.17748328, ..., 3.60555128, 3.61420807,
        3.65624124],
       [0.        , 0.        , 0.        , ..., 1.        , 1.        ,
        1.        ],
       [0.        , 3.16355812, 3.17214439, ..., 3.32603367, 3.32603367,
        3.36340601]])
In [59]:
# prepare the functions that allows to identify the index from name from the KDTree algorithm
def get_id_from_partial_name_kdt(partial):
    for name in all_profil_names:
        if partial in name:
            print(name,all_profil_names.index(name))
In [60]:
indice_kdtree[14]
indices[14]
Out[60]:
array([  14, 7085,  491, 2546, 9328,  234, 6732, 9830, 9862, 9021, 5072],
      dtype=int64)
In [63]:
# print_similar_profile_kdt is a function that allows to have a dataframe that contains name, job, distance and url
# for the 10 closest profile using KDTree algorithm
def print_similar_profil_kdt(query=None,id=None):
    i=0
    if id:
        df_sim_kd=pd.DataFrame(index=indice_kdtree[id],columns=["name","job2","distance","url"])
        for id1 in indice_kdtree[id][0:]:
            df_sim_kd.loc[id1,"name"]=df_final.iloc[id1]["name"]
            df_sim_kd.loc[id1,"job2"]=df_final.iloc[id1]["job2"]
            df_sim_kd.loc[id1,"distance"]=distance_kdtree[id][i]
            df_sim_kd.loc[id1,"url"]= personal_info1.loc[id1,"url"]
            i+=1
    if query:
        found_id = get_index_from_name(query)
        df_sim_kd=pd.DataFrame(index=indice_kdtree[found_id],columns=["name","job2","distance","url"])
        for id1 in indice_kdtree[found_id][0:]:
            df_sim_kd.loc[id1,"name"]=df_final.iloc[id1]["name"]
            df_sim_kd.loc[id1,"job2"]=df_final.iloc[id1]["job2"]
            df_sim_kd.loc[id1,"distance"]=distance_kdtree[found_id][i]
            df_sim_kd.loc[id1,"url"]= personal_info1.loc[id1,"url"]
            i+=1
        
        
    return df_sim_kd.style.format({'url':make_clickable})
In [66]:
# example of print_similar_profil using name
print_similar_profil_kdt("Malek Massoudi")
Out[66]:
name job2 distance url
3604 Malek Massoudi DRUPAL 0.000000 https://www.linkedin.com/in/malek-massoudi-8822aaa2
4361 Sofiene Chaari DRUPAL 5.996574 https://www.linkedin.com/in/sofiene-chaari
5155 haythem hammami Stage 7.395870 https://www.linkedin.com/in/haythem-hammami-06129466
5626 Dhafer Ben Slama PHP/Symfony 7.504166 https://www.linkedin.com/in/benslama
1522 Walid Guesmi DRUPAL 7.552410 https://www.linkedin.com/in/wguesmi09
5487 Tlili Achref PHP/Symfony 7.783727 https://www.linkedin.com/in/tlili-achref-951857a2
3812 Rami KESSENTINI PHP/Symfony 7.806177 https://www.linkedin.com/in/rami-kessentini-bb525967
9779 Ahmed BAKLOUTI PHP/Symfony 7.862093 https://www.linkedin.com/in/ahmedbaklouti
5239 Ben wanes Mohamed Ali PHP/Symfony 7.925434 https://www.linkedin.com/in/benwanesmohamedali
451 chaibi issam PHP/Symfony 7.956915 https://www.linkedin.com/in/chaibi-issam-53275724
In [65]:
print_similar_profil("khaled ben jannet")
Out[65]:
name job2 distance url
8985 khaled ben jannet Data_Science 0.000000 https://www.linkedin.com/in/khaled-ben-jannet-64987920
6433 Achraf CHATTI Data_Science 3.358407 https://www.linkedin.com/in/achrafchatti
6111 Maimoun BEN TAHER, PMP® Data_Science 3.644023 https://www.linkedin.com/in/maimoun-ben-taher-pmp®-32244150
8923 badreddine cherni Other 3.648630 https://www.linkedin.com/in/badreddine-cherni-62366613a
8847 Mohamed BOUHAHA Other 3.674235 https://www.linkedin.com/in/mohamed-bouhaha-23b340a7
1969 Bessem TOUHAMI ☁ Data_Science 3.742513 https://www.linkedin.com/in/bessem-touhami
4549 Manel Ben Ali Data_Science 3.783186 https://www.linkedin.com/in/manel-ben-ali-1aa86959
8457 Mohamed Amine SELLAMI Other 3.798210 https://www.linkedin.com/in/mohamed-amine-sellami-06206654
9053 selma kraiem Data_Science 3.801171 https://www.linkedin.com/in/selma-kraiem-6702b683
2520 Wael Othmani Data_Science 3.816084 https://www.linkedin.com/in/wael-othmani-5a55b95a
4712 Hajer CHERIF Other 3.819215 https://www.linkedin.com/in/hajer-cherif-4250019b
In [502]:
print_similar_profil_kdt(id=14)
Out[502]:
name job2 distance url
14 Hanen Ben Ali FullStack JS 0.000000 https://www.linkedin.com/in/hanen-ben-ali-82617591
843 Oumayma Metoui FullStack JS 4.735652 https://www.linkedin.com/in/oumayma-metoui
3307 Hamza Romdhani FullStack JS 4.956057 https://www.linkedin.com/in/hamza-romdhani-892444119
6108 Achref Sellami FullStack JS 5.100872 https://www.linkedin.com/in/achref-sellami-8888b766
8732 Amine Gader Développeur Fullstack JS 5.129571 https://www.linkedin.com/in/amine-gader-039b9810a
6850 Aymen DELLY FullStack JS 5.129571 https://www.linkedin.com/in/aymendelly
6694 Bilel LOUATI FullStack JS 5.132797 https://www.linkedin.com/in/bilellouati
2163 Yosra Borchani FullStack JS 5.135066 https://www.linkedin.com/in/yosra-borchani-343b13a4
3765 Brahim Mahjoub FullStack JS 5.188343 https://www.linkedin.com/in/brahim-mahjoub-67846a52
7576 Ibrahim Sassi FullStack JS 5.290142 https://www.linkedin.com/in/ibrahimsassi
In [503]:
print_similar_profil(id=14)
Out[503]:
name job2 distance url
14 Hanen Ben Ali FullStack JS 0.000000 https://www.linkedin.com/in/hanen-ben-ali-82617591
843 Oumayma Metoui FullStack JS 4.735652 https://www.linkedin.com/in/oumayma-metoui
3307 Hamza Romdhani FullStack JS 4.956057 https://www.linkedin.com/in/hamza-romdhani-892444119
6108 Achref Sellami FullStack JS 5.100872 https://www.linkedin.com/in/achref-sellami-8888b766
6850 Aymen DELLY FullStack JS 5.129571 https://www.linkedin.com/in/aymendelly
8732 Amine Gader Développeur Fullstack JS 5.129571 https://www.linkedin.com/in/amine-gader-039b9810a
6694 Bilel LOUATI FullStack JS 5.132797 https://www.linkedin.com/in/bilellouati
2163 Yosra Borchani FullStack JS 5.135066 https://www.linkedin.com/in/yosra-borchani-343b13a4
3765 Brahim Mahjoub FullStack JS 5.188343 https://www.linkedin.com/in/brahim-mahjoub-67846a52
7576 Ibrahim Sassi FullStack JS 5.290142 https://www.linkedin.com/in/ibrahimsassi
5885 Chams Eddine Ben Salem Développeur Fullstack JS 5.409076 https://www.linkedin.com/in/chams-eddine-ben-salem

Cosin similarity

In [50]:
# calculate the cosine similarity using its theoretical formula
def similarity(x,y):
    return np.inner(x, y) / (ln.norm(x, ord=2) * ln.norm(y, ord=2))
In [53]:
similarity(A[5165],A[6108])
Out[53]:
0.9453698694738543
In [54]:
similarity(A[14],A[3307])
Out[54]:
0.8482291339272666
In [55]:
similarity(A[14],A[6108])
Out[55]:
0.8697330332490425
In [56]:
similarity(A[14],A[843])
Out[56]:
0.8473722875185898
In [282]:
# Store all the calculated similarity in a dataframe 
df_score = pd.read_csv("score_fin1.csv" , sep='\t')
In [283]:
df_score.drop(['Unnamed: 0'] , axis=1 , inplace=True)
In [284]:
df_score
Out[284]:
0 1 2 3 4 ... 9995 9996 9997 9998 9999
0 1.00000 0.45885 0.98196 0.26352 0.14688 ... 0.70420 0.05641 0.68538 0.03606 0.84777
1 0.45885 1.00000 0.49151 0.60473 0.55516 ... 0.72564 0.37172 0.67452 0.14615 0.66621
2 0.98196 0.49151 1.00000 0.33384 0.15642 ... 0.72946 0.12171 0.75265 0.07503 0.87169
3 0.26352 0.60473 0.33384 1.00000 0.57076 ... 0.66668 0.54781 0.65363 0.23290 0.54875
4 0.14688 0.55516 0.15642 0.57076 1.00000 ... 0.58925 0.55118 0.46637 0.29219 0.48381
... ... ... ... ... ... ... ... ... ... ... ...
9995 0.70420 0.72564 0.72946 0.66668 0.58925 ... 1.00000 0.41948 0.84669 0.21568 0.89603
9996 0.05641 0.37172 0.12171 0.54781 0.55118 ... 0.41948 1.00000 0.43010 0.64187 0.27918
9997 0.68538 0.67452 0.75265 0.65363 0.46637 ... 0.84669 0.43010 1.00000 0.21132 0.84320
9998 0.03606 0.14615 0.07503 0.23290 0.29219 ... 0.21568 0.64187 0.21132 1.00000 0.14286
9999 0.84777 0.66621 0.87169 0.54875 0.48381 ... 0.89603 0.27918 0.84320 0.14286 1.00000

10000 rows × 10000 columns

In [422]:
# Compute a function that allows to put the correspodant name, job, similarity and url for the 10 closest similarity profile
def similar_cosin(query=None,indice=None):
    if indice:
        sc1 =df_score.loc[indice].nlargest(20).iloc[0:]
        sc1.index=sc1.index.astype('int64')
    
        df_sim_cosin=pd.DataFrame(index=sc1.index,columns=["name","job2","similarity","url"])
        df_sim_cosin.index =df_sim_cosin.index.astype('int64')

    
        for id1 in sc1.index.astype('int64'):
            df_sim_cosin.loc[id1,"name"]=df_final.iloc[id1]["name"]
            df_sim_cosin.loc[id1,"job2"]=df_final.iloc[id1]["job2"]
            df_sim_cosin.loc[id1,"similarity"]=sc1[id1]
            df_sim_cosin.loc[id1,"url"]= personal_info1.loc[id1,"url"]
    if query:
        found_id = get_index_from_name(query)
        sc1 =df_score.loc[found_id].nlargest(20).iloc[0:]
        sc1.index=sc1.index.astype('int64')
    
        df_sim_cosin=pd.DataFrame(index=sc1.index,columns=["name","job2","similarity","url"])
        df_sim_cosin.index =df_sim_cosin.index.astype('int64')

    
        for id1 in sc1.index.astype('int64'):
            df_sim_cosin.loc[id1,"name"]=df_final.iloc[id1]["name"]
            df_sim_cosin.loc[id1,"job2"]=df_final.iloc[id1]["job2"]
            df_sim_cosin.loc[id1,"similarity"]=sc1[id1]
            df_sim_cosin.loc[id1,"url"]= personal_info1.loc[id1,"url"]
        
    return  df_sim_cosin.style.format({'url':make_clickable})
In [423]:
# example of similar_cosin using name
similar_cosin("khaled ben jannet")
Out[423]:
name job2 similarity url
8985 khaled ben jannet Product Owner 1.000000 https://www.linkedin.com/in/khaled-ben-jannet-64987920
6111 Maimoun BEN TAHER, PMP® Product Owner 0.944460 https://www.linkedin.com/in/maimoun-ben-taher-pmp®-32244150
4867 Ghazi TEKAYA Product Owner 0.936830 https://www.linkedin.com/in/ghazitekaya
7867 Nabil LAADHARI Product Owner 0.936620 https://www.linkedin.com/in/nabillaadhari
9844 Manel Hammouda CSPO Product Owner 0.936400 https://www.linkedin.com/in/manel-hammouda-cspo-5b52051b
8585 hassen feki Product Owner 0.932270 https://www.linkedin.com/in/hassen-feki-75726b60
4951 Imen Laabidi Product Owner 0.930980 https://www.linkedin.com/in/imen-laabidi-73033087
6512 Imededdine HOSNI Product Owner 0.929300 https://www.linkedin.com/in/imededdinehosni
6940 Mohamed Salama ZIADI Product Owner 0.926920 https://www.linkedin.com/in/mohamed-salama-ziadi-1b6719a
1134 Hamza Zayani Product Owner 0.924480 https://www.linkedin.com/in/zayanihamza
3075 Feki Firas Product Owner 0.924030 https://www.linkedin.com/in/feki-firas
7774 Meriem Chakroun Product Owner 0.922270 https://www.linkedin.com/in/meriem-chakroun-a315b845
6433 Achraf CHATTI Product Owner 0.921050 https://www.linkedin.com/in/achrafchatti
7379 Mariem Zorai Product Owner 0.919410 https://www.linkedin.com/in/meriem-zora%C3%AE-21a4691a
5109 Chèdi Zbidi Product Owner 0.918100 https://www.linkedin.com/in/chèdi-zbidi-854424100
5100 Hsouna RIAHI Product Owner 0.917970 https://www.linkedin.com/in/hsouna-riahi-1a0a3714
3864 Khaoula TBARKI Product Owner 0.917770 https://www.linkedin.com/in/khaoula-tbarki-299a528a
4428 Moez Hajjem Product Owner 0.917580 https://www.linkedin.com/in/moezhajjem
6999 Wassim Sakly Product Owner 0.917420 https://www.linkedin.com/in/wassim-sakly-1a094638
5575 Sana Mayara Product Owner 0.917230 https://www.linkedin.com/in/sana-mayara-51665123
In [ ]:
 

Correlation Test

In [33]:
# calculate Kendall’s correlation
corr, _ = kendalltau(A[1143],A[8526])

# display the result of the correlation
print("Kendalls tau: %.3f" % corr)
Kendalls tau: 0.246
In [34]:
# calculate Spearman's correlation
corr, _ = spearmanr(A[1143],A[8526])

# display the result of the correlation
print("Spearmans correlation: %.3f" % corr)
Spearmans correlation: 0.252
In [35]:
# calculate Pearson's correlation
corr, _ = pearsonr(A[1143],A[8526])

# display the result of the correlation
print("Pearsons correlation: %.3f" % corr)
Pearsons correlation: 0.034

---------------------------------------------------------------------------------------------------------------------------

IN this section we tryed :

1- assign coefficients to the important columns that we needed in our search for the best similar profiles to separate them from the normal columns and to highlight their importance.

2- Projecting profiles in order to calculate the distance between them and the desired profile and choose the most similar ones based on that distance

In [39]:
df_final1=pd.concat([df,personal_info1['name']],axis=1)
df['date_exp']=round(df['date_exp']/12 , 2)
In [40]:
# Creating lists contain the most relevent colomns
skills_pro=["javascript","sql","nosql","node.js","express.js","koa.js","hapi.js","angularjs","react.js","jquery","bash","nginx","c","c++","html5","css","rest","sass","postcss","webpack","gitlab","linux","embedded c","embedded c++","java","jee","microservices","intégration continue","docker","aws","nodejs",	"ext.js","html","mongodb","mysql","spring","soa","soap","git","svn","jira","confluence","spring boot","spring security","java 8","php","symfony","architecture restful","cms","drupal",	"scrum","analyse fonctionnelle"]
education=["Engineer","Master","Licence"]
other=["OTHERS","Others_Degree","Others_type_Of_Study","others"]
exp=["date_exp"]
location=["Tunisia"]
coef =[(skills_pro,10),(education,3),(other,0),(location,2),(exp,5)]
In [33]:
def coeff(df,coef):
    T=df.copy()
    for key , val in coef :
        if val ==0:
            T.drop(key,axis=1,inplace=True)
        else :
            for i in key :
                T[i]=T[i].apply(lambda x: x*val)
    return T   
In [34]:
#Calculate the distance between 2 rows
from math import sqrt
 
def euclidean_distance(row1, row2):
	distance = 0.0
	for i in range(len(row1)-1):
		distance += (row1[i] - row2[i])**2
	return sqrt(distance)
In [35]:
# Locate the most similar neighbors
def get_neighbors(train, test_row, num_neighbors):
	distances = list()
	for train_row in train:
		dist = euclidean_distance(test_row, train_row)
		distances.append((train_row, dist))
	distances.sort(key=lambda tup: tup[1])
	neighbors = list()
	for i in range(num_neighbors):
		neighbors.append(distances[i][0])
	return neighbors
In [36]:
Q=df_final1.iloc[:,0:-3]
Q=coeff(Q,coef)
In [41]:
NV=pd.concat([Q,df_final["name"]],axis=1).to_numpy()
In [42]:
# finding the most 10 similar profiles based on one profile
neighbors = get_neighbors(NV, NV[1], 10)
for neighbor in neighbors:
	print(neighbor)
[20.4 0.0 10.0 0.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 20.0 0.0 30.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 30.0 0.0 0.0 10.0 0.0 0.0 0.0 20.0 10.0 10.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0
 1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0
 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.0
 3.5 1.0 2.0 0.0 'Helmi Nour']
[25.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 2.0 0.0 'Dhekra CHTIOUI']
[20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 0.0 40.0 0.0 0.0 0.0
 10.0 0.0 0.0 0.0 0.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.0 3.0
 0.0 0.0 0.0 'Mohamed Amine BOUMAIZA']
[35.85 0.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0
 1.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 1.5
 1.0 2.0 0.0 'Bohli Dhekra']
[21.65 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0
 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 1.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 3.0 0.0 0.0 3.5
 1.0 2.0 0.0 'Houcem YAHYA']
[21.65 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 0.0 30.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 1.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.0 3.5
 1.0 0.0 0.0 'Mouna ZRIBI']
[21.65 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 0.0 40.0 20.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 30.0 0.0 0.0 10.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 10.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.0
 3.5 0.0 2.0 0.0 'Oussama Rouatbi']
[20.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 0.0 0.0 0.0 0.0
 10.0 0.0 0.0 0.0 10.0 0.0 0.0 10.0 0.0 0.0 0.0 10.0 10.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5
 0.0 0.0 0.0 'Winnie KEMTSOP']
[19.15 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 10.0 0.0 0.0 10.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.5 0.0 0.0 0.0 'Slaheddinne Ahmed']
[24.6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 0.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0
 2.0 0.0 'Ramzi Thabet']